//添加属性拦截器
function defineRetive(hd, key, value) {
  Object.defineProperty(hd, key, {
    get() {
      console.log("获取");
      return value;
    },
    set(newValue) {
      console.log("设置");
      value = newValue;
    },
  });
}

let hd = {
  name: "yahoo",
  article: {
    title: "一篇文章",
    child: {
      desc: "vue.js",
    },
  },
  news: [{ title: "在线电影" }],
};

//递归的拦截属性
function observe(data) {
  if (typeof data !== "object" || data == null) return;

  if (Array.isArray(data)) {
    setArrayPrototype(data);
  }
  for (let [key, value] of Object.entries(data)) {
    //递归拦截属性
    observe(value);
    defineRetive(data, key, value);
  }
}
//设置数组对象的原型
//目的：为新原型添加 push，
//在新push方法 中添加拦截器
function setArrayPrototype(arr) {
  //添加新原型，新原型的原型为 Array.prototype
  let newPrototype = Object.create(Array.prototype);
  newPrototype.push = function (...args) {
    Array.prototype.push.call(this, ...args);
    observe(args);
  };
  //设置数组对象的原型为新增加的原型
  Object.setPrototypeOf(arr, newPrototype);
}

observe(hd);
hd.news.push({ title: "联网游戏" });

//对象属性拦截
hd.$set = function (key, value) {
  this[key] = value;

  if (typeof value === "object" && value !== null) {
    observe(value);
  } else {
    defineRetive(this, key, value);
  }
};

hd.$set("url", { host: "https://facebook.com" });
console.log(hd);

//let arr = { title: "yyyy" };
//arr.__proto__ = window;
//for (let [k, v] of Object.entries(arr)) {
//  console.log(k);
//}
//doc.houdunren.com
